package org.xg.study.boot.common.config;

import org.hibernate.validator.HibernateValidator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.validation.beanvalidation.MethodValidationPostProcessor;

import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;

/**
 * @author CMG
 * @version 1.0
 * @cLassName ValidatorConfig
 * @description
 * @date 2021/8/26 9:09
 **/
@Configuration
public class ValidatorConfig {
    /**
     * HibernateValidator默认是一次性返回所有验证不通过的集合，时候我们要求只有一个参数错误，马上返回错误结果，不在进行后续的校验
     * 1、普通模式(默认是这个模式)
     *    普通模式(会校验玩所有属性，然后返回所有的验证失败信息)
     * 2、快速失败返回模式
     *    快速失败返回模式(只要有个验证失败，则返回)
     * 主要配置在failFast(true)
     * @return
     */
    @Bean
    public MethodValidationPostProcessor methodValidationPostProcessor(){
        MethodValidationPostProcessor methodValidationPostProcessor = new MethodValidationPostProcessor();
        methodValidationPostProcessor.setValidator(validator());
        return methodValidationPostProcessor;

    }

    @Bean
    public Validator validator(){
        ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class)
                .configure().failFast(true).buildValidatorFactory();
        Validator validator = validatorFactory.getValidator();
        return validator;
    }


    /**
     * 常用的基本校验说明
     */
    public void desc(){
        /**
         * 1、@Null 被注释的元素必须为Null
         * 2、@NotNull 被注释的元素必须给为NotNull
         * 3、@AssertTrue 被注释的元素必须为true
         * 4、@Min(value) 被注释的元素必须是一个数字，其值必须大于等于指定的最小值
         * 5、@Max(value) 被注释的元素必须是一个数字，其值必须小于等于指定的最大值
         * 6、DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
         * 7、DecimalMax(value) 被注释的元素必须是一个数字，其值必须小于等于指定的最大值
         * 8、Size(max=,min=) 被注释的元素的大小必须在指定返回内
         * 9、Digits(integer,fraction) 被注释的元素必须是一个数字，其值必须可以在接受范围内
         * 10、Past 被注释的元素必须是一个过去的日期
         * 11、Future 被注释的元素必须是一个将来的日期
         * 12、Pattern(regex=,flag=) 被注释的元素必须符合指定的正则表达式
         * 13、NotBlank(message=) 验证字符串非null，且长度必须大于0
         * 14、Email 被注释的元素必须是电子邮箱地址
         * 15 Length(min=,max=) 被注释的元素字符串的大小必须在指定的范围内
         * 16、NotEmpty 被注释的字符串的必须非空
         * 17、Range(min=,max=,message) 被注释的元素必须在合适的范围内
         */

    }
}
